home *** CD-ROM | disk | FTP | other *** search
/ QuickTime 2.0 Developer Kit / QuickTime 2.0 Developer Kit.iso / mac / MAC / Programming Stuff / Sample Code / Mixed Bag / Sample Components / ImportScrapbook.c < prev    next >
Encoding:
C/C++ Source or Header  |  1992-10-22  |  6.3 KB  |  213 lines  |  [TEXT/MPS ]

  1. /*
  2.     File:        ImportScrapbook.r
  3.  
  4.     Written by:    Peter Hoddie
  5.  
  6.     Copyright:    © 1992 by Apple Computer, Inc., all rights reserved.
  7.  
  8. */
  9.  
  10. #include <Files.h>
  11. #include <FixMath.h>
  12. #include <QDOffscreen.h>
  13. #include <QuickDraw.h>
  14. #include <Resources.h>
  15. #include <SysEqu.h>
  16. #include <ToolUtils.h>
  17.  
  18. #include <QuickTimeComponents.h>
  19.  
  20. #define kMediaTimeScale 600
  21.  
  22. typedef struct {
  23.     ComponentInstance self;
  24.     TimeValue frameDuration;
  25. } ImportScrapbookGlobalsRecord, **ImportScrapbookGlobals;
  26.  
  27. pascal ComponentResult ImportScrapbookDispatcher(ComponentParameters *params, Handle storage);
  28. pascal ComponentResult ImportScrapbookOpen(ImportScrapbookGlobals storage, ComponentInstance self);
  29. pascal ComponentResult ImportScrapbookClose(ImportScrapbookGlobals storage, ComponentInstance self);
  30. pascal ComponentResult ImportScrapbookCanDo( ImportScrapbookGlobals storage, short ftnNumber );
  31. pascal ComponentResult ImportScrapbookVersion( ImportScrapbookGlobals storage );
  32. pascal ComponentResult ImportScrapbookSetSampleDuration(ImportScrapbookGlobals storage, 
  33.             TimeValue duration, TimeScale scale);
  34. pascal ComponentResult ImportScrapbookFile(ImportScrapbookGlobals storage, FSSpec *theFile, 
  35.             Movie theMovie, Track targetTrack, Track *usedTrack, 
  36.             TimeValue atTime, TimeValue *addedTime, long inFlags, long *outFlags);
  37.  
  38. short pageToMapIndex(short page, Ptr map);
  39.  
  40. // entry point for all Component Manager requests
  41. pascal ComponentResult ImportScrapbookDispatcher(ComponentParameters *params, Handle storage)
  42. {
  43.     OSErr err = badComponentSelector;
  44.     ComponentFunction componentProc = 0;
  45.  
  46.     switch (params->what) {
  47.         case kComponentOpenSelect: componentProc = ImportScrapbookOpen; break;
  48.         case kComponentCloseSelect: componentProc = ImportScrapbookClose; break;
  49.         case kComponentCanDoSelect: componentProc = ImportScrapbookCanDo; break;
  50.         case kComponentVersionSelect: componentProc = ImportScrapbookVersion; break;
  51.         case kMovieImportFileSelect: componentProc = ImportScrapbookFile; break;
  52.         case kMovieImportSetSampleDurationSelect: componentProc = ImportScrapbookSetSampleDuration; break;
  53.     }
  54.  
  55.     if (componentProc)
  56.         err = CallComponentFunctionWithStorage(storage, params, componentProc);
  57.  
  58.     return err;
  59. }
  60.  
  61. pascal ComponentResult ImportScrapbookCanDo( ImportScrapbookGlobals storage, short ftnNumber )
  62. {
  63.     switch (ftnNumber) {
  64.         case kComponentOpenSelect: 
  65.         case kComponentCloseSelect: 
  66.         case kComponentCanDoSelect: 
  67.         case kComponentVersionSelect: 
  68.         case kMovieImportFileSelect: 
  69.         case kMovieImportSetSampleDurationSelect: 
  70.             return true;
  71.         default:
  72.             return false;
  73.     }
  74. }
  75.  
  76. pascal ComponentResult ImportScrapbookVersion( ImportScrapbookGlobals storage )
  77. {
  78.     return 0x00010001;
  79. }
  80.  
  81. pascal ComponentResult ImportScrapbookOpen(ImportScrapbookGlobals storage, ComponentInstance self)
  82. {
  83.     storage = (ImportScrapbookGlobals)NewHandleClear(sizeof(ImportScrapbookGlobalsRecord));
  84.     if (!storage) return MemError();
  85.     (**storage).self = self;
  86.     SetComponentInstanceStorage(self, (Handle)storage);
  87.  
  88.     return noErr;
  89. }
  90.  
  91. pascal ComponentResult ImportScrapbookClose(ImportScrapbookGlobals storage, ComponentInstance self)
  92. {
  93.     if (storage) DisposeHandle((Handle)storage);
  94.  
  95.     return noErr;
  96. }
  97.  
  98. // if this routine is called, it provides a hint from the caller as to the
  99. //    desired sample (frame) duration in the new media.
  100. pascal ComponentResult ImportScrapbookSetSampleDuration(ImportScrapbookGlobals storage, 
  101.                 TimeValue duration, TimeScale scale)
  102. {
  103.     TimeRecord tr;
  104.  
  105.     tr.value.lo = duration;
  106.     tr.value.hi = 0;
  107.     tr.scale = 0;
  108.     tr.base = nil;
  109.     ConvertTimeScale(&tr, kMediaTimeScale);        // our new media will have a TimeScale of 600
  110.  
  111.     (**storage).frameDuration = tr.value.lo;
  112.  
  113.     return noErr;
  114. }
  115.  
  116. pascal ComponentResult ImportScrapbookFile(ImportScrapbookGlobals storage, FSSpec *theFile,
  117.         Movie theMovie, Track targetTrack, Track *usedTrack, 
  118.         TimeValue atTime, TimeValue *addedTime, long inFlags, long *outFlags)
  119. {
  120.     OSErr err;
  121.     short resRef = 0, saveRes = CurResFile();
  122.     PicHandle thePict;
  123.     Rect trackRect;
  124.     short pageIndex = 0;
  125.     Track newTrack = 0;
  126.     Media newMedia;
  127.     Boolean endMediaEdits = false;
  128.     TimeValue frameDuration;
  129.     SampleDescriptionHandle sampleDesc = 0;
  130.  
  131.     *outFlags = 0;
  132.     if (inFlags & movieImportMustUseTrack)
  133.         return invalidTrack;
  134.  
  135.     // open up source file
  136.     resRef = FSpOpenResFile(theFile, fsRdPerm);
  137.     if (err = ResError()) goto bail;
  138.     UseResFile(resRef);
  139.  
  140.     // get the first PICT to determine the track size
  141.     thePict = (PicHandle)Get1IndResource('PICT', 1);
  142.     if (!thePict) {
  143.         err = ResError();
  144.         goto bail;
  145.     }
  146.     trackRect = (**thePict).picFrame;
  147.     OffsetRect(&trackRect, -trackRect.left, -trackRect.top);
  148.  
  149.  
  150.     // create a track and 'PICT' media
  151.     newTrack = NewMovieTrack(theMovie, trackRect.right << 16, trackRect.bottom << 16, kNoVolume);
  152.     if (err = GetMoviesError()) goto bail;
  153.     newMedia = NewTrackMedia(newTrack, 'PICT', kMediaTimeScale, nil, 0);
  154.     if (err = GetMoviesError()) goto bail;
  155.     if (err = BeginMediaEdits(newMedia)) goto bail;
  156.     endMediaEdits = true;
  157.  
  158.     // determine the frame duration (check the hint we may have been called with)
  159.     frameDuration = (**storage).frameDuration;
  160.     if (!frameDuration) frameDuration = kMediaTimeScale/5;                    // default is 1/5th sec 
  161.  
  162.     // set up a simple sample description
  163.     sampleDesc = (SampleDescriptionHandle)NewHandleClear(sizeof(SampleDescription));
  164.     (**sampleDesc).descSize = sizeof(SampleDescription);
  165.     (**sampleDesc).dataFormat = 'PICT';
  166.  
  167.     // interate through all source frames and add them to the media
  168.     do {
  169.         Handle thePict;
  170.         short resID = pageToMapIndex(++pageIndex, *GetResource('SMAP', 0));
  171.  
  172.         if (resID == 0) break;
  173.         thePict = Get1Resource('PICT', resID);
  174.         if (thePict == nil) continue;        // some pages may not contain a PICT
  175.  
  176.         err = AddMediaSample(newMedia, thePict, 0, GetHandleSize(thePict),
  177.             frameDuration, sampleDesc, 1, 0, nil);
  178.  
  179.         ReleaseResource(thePict);
  180.         DisposeHandle(thePict);
  181.     } while (!err);
  182.     if (err) goto bail;
  183.  
  184.     // add the new media to the track
  185.     err = InsertMediaIntoTrack(newTrack, 0, 0, GetMediaDuration(newMedia), kFix1);
  186.  
  187. bail:
  188.     if (resRef) CloseResFile(resRef);
  189.     if (endMediaEdits) EndMediaEdits(newMedia);
  190.     if (err && newTrack) {
  191.         DisposeMovieTrack(newTrack);
  192.         newTrack = 0;
  193.     }
  194.     UseResFile(saveRes);
  195.     if (sampleDesc) DisposeHandle((Handle)sampleDesc);
  196.     *usedTrack = newTrack;
  197.  
  198.     return err;
  199. }
  200.  
  201. // map from a Scrapbook page number to a resource id
  202. short pageToMapIndex(short page, Ptr map)
  203. {
  204.     short mapIndex;
  205.  
  206.     for (mapIndex = 0; mapIndex < 256; mapIndex++)
  207.         if (*map++ == page)
  208.             return mapIndex | 0x8000;
  209.  
  210.     return 0;
  211. }
  212.  
  213.